Service Network型VPCエンドポイントの作成が失敗しても使える時の裏側を確認してみた
Service Network型VPCエンドポイントの作成に失敗しているようだが、実際には通信できるんだが
こんにちは、のんピ(@non____97)です。
皆さんは「Service Network型VPCエンドポイントの作成に失敗しているようだが、実際には通信できるんだが」という場面に遭遇したことはありますか? 私はあります。
実際の様子は以下記事をご覧ください。
この時は沼にハマりそうだと思い、深掘りはしなかったのですが、やはり気になってきました。
この裏側で何が起きていたのか調査してみます。
いきなりまとめ
- Service Network型VPCエンドポイントを作成する場合は、残りのIPアドレスの個数だけではなく残りの/28のCIDRブロックが重要
- VPCエンドポイントのENIそれぞれに
/28
のIPv4プレフィックス委任が設定されるため
- VPCエンドポイントのENIそれぞれに
- Service Network型VPCエンドポイントを複数作成しようとすると、すぐにIPアドレスが枯渇する
- 1つのService Networkに集約するか、Service Network型VPC Associationを使用しよう
- 1つのサブネットに複数のENIを作成しようとする条件は不明
検証環境
検証環境は以下のとおりです。
以前の記事と同じです。Service Network型VPCエンドポイント以外は作成済みの状態です。
サブネットマスクが/26で空きIPアドレスが60個程度あるサブネット2つ指定する
まず、サブネットマスクが/26で空きIPアドレスが60個程度あるサブネット2つ指定する場合で検証します。
これは前回の記事と同じ構成です。
試してみます。
# 空きIPアドレスの確認
> aws ec2 describe-subnets \
--subnet-ids subnet-0a84d8f4554925b16 subnet-0f6a1ce53b9fd9793 \
--query 'Subnets[].{SubnetId : SubnetId, AvailableIpAddressCount : AvailableIpAddressCount}'
[
{
"SubnetId": "subnet-0f6a1ce53b9fd9793",
"AvailableIpAddressCount": 59
},
{
"SubnetId": "subnet-0a84d8f4554925b16",
"AvailableIpAddressCount": 57
}
]
# VPCエンドポイントの作成
> aws ec2 create-vpc-endpoint \
--vpc-endpoint-type ServiceNetwork \
--service-network-arn arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09 \
--vpc-id vpc-0d54cbe88a44ffd04 \
--subnet-ids subnet-0a84d8f4554925b16 subnet-0f6a1ce53b9fd9793 \
--security-group-ids sg-0e2239cc74c5c84f9 \
--private-dns-enabled
{
"VpcEndpoint": {
"VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
"VpcEndpointType": "ServiceNetwork",
"VpcId": "vpc-0d54cbe88a44ffd04",
"State": "Pending",
"SubnetIds": [
"subnet-0a84d8f4554925b16",
"subnet-0f6a1ce53b9fd9793"
],
"Groups": [
{
"GroupId": "sg-0e2239cc74c5c84f9",
"GroupName": "default"
}
],
"IpAddressType": "IPV4",
"PrivateDnsEnabled": true,
"CreationTimestamp": "2024-12-19T08:18:49.081000+00:00",
"Tags": [],
"OwnerId": "<AWSアカウントID>",
"ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
}
}
# 失敗したことの確認
> aws ec2 describe-vpc-endpoints --vpc-endpoint-ids vpce-0e3b1bfc42d162c4a
{
"VpcEndpoints": [
{
"VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
"VpcEndpointType": "ServiceNetwork",
"VpcId": "vpc-0d54cbe88a44ffd04",
"State": "Failed",
"SubnetIds": [
"subnet-0a84d8f4554925b16",
"subnet-0f6a1ce53b9fd9793"
],
"Groups": [
{
"GroupId": "sg-0e2239cc74c5c84f9",
"GroupName": "default"
}
],
"IpAddressType": "IPV4",
"PrivateDnsEnabled": true,
"NetworkInterfaceIds": [
"eni-0f995ce7b1b9589de",
"eni-09199f7c86c4cddf9"
],
"CreationTimestamp": "2024-12-19T08:18:49.081000+00:00",
"Tags": [],
"OwnerId": "<AWSアカウントID>",
"ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
}
]
}
# 失敗しても関連付けは正常に成功したことを確認
> aws ec2 describe-vpc-endpoint-associations --vpc-endpoint-ids vpce-0e3b1bfc42d162c4a
{
"VpcEndpointAssociations": [
{
"Id": "vpce-rsc-asc-06a4438e30d46815f",
"VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
"ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
"ServiceNetworkName": "test-service-network-a",
"AssociatedResourceAccessibility": "Accessible",
"DnsEntry": {
"DnsName": "vpce-0e3b1bfc42d162c4a-snra-0834edfa483e3c18a.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
"HostedZoneId": "Z08285483B41F6ASEM5U1"
},
"AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0f8b3049b4a9710e0"
},
{
"Id": "vpce-rsc-asc-097ca8d41087fe203",
"VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
"ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
"ServiceNetworkName": "test-service-network-a",
"AssociatedResourceAccessibility": "Accessible",
"DnsEntry": {
"DnsName": "vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
"HostedZoneId": "Z08285483B41F6ASEM5U1"
},
"AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0b39a245f47c880f8"
},
{
"Id": "vpce-rsc-asc-09d942c31354b6c9f",
"VpcEndpointId": "vpce-0e3b1bfc42d162c4a",
"ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
"ServiceNetworkName": "test-service-network-a",
"AssociatedResourceAccessibility": "Accessible",
"DnsEntry": {
"DnsName": "vpce-0e3b1bfc42d162c4a-snra-051f07462219345e1.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
"HostedZoneId": "Z08285483B41F6ASEM5U1"
},
"AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-052f0211d381fbcfc"
}
]
}
はい、ステータスはFailed
になりましたが、関連付けは正常に成功しています。
VPCエンドポイントのDNS名の名前解決やSSHも可能です。
$ dig vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws
; <<>> DiG 9.18.28 <<>> vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49721
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. IN A
;; ANSWER SECTION:
vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. 60 IN A 10.10.10.31
;; Query time: 10 msec
;; SERVER: 10.10.10.2#53(10.10.10.2) (UDP)
;; WHEN: Thu Dec 19 14:49:27 UTC 2024
;; MSG SIZE rcvd: 154
# ssh
$ ssh ec2-user@vpce-0e3b1bfc42d162c4a-snra-0c4e6759c5c90deda.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws -i ~/.ssh/non-97-test.pem
A newer release of "Amazon Linux" is available.
Version 2023.6.20241212:
Run "/usr/bin/dnf check-release-update" for full release and version update info
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
Last login: Thu Dec 19 09:05:16 2024 from 10.10.10.45
[ec2-user@ip-10-10-10-117 ~]$ hostname -i
10.10.10.117
[ec2-user@ip-10-10-10-117 ~]$ TOKEN=$(
curl -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
-s
)
[ec2-user@ip-10-10-10-117 ~]$ curl \
-H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-id
i-0ae4b4d9c4e67eef0[ec2-user@ip-10-10-10-117 ~]$
そのため、正直このままでも困らないです。
CloudTrailのイベントを見て何が起きているのか探っていきましょう。
StartQuery
やPutEvaluations
は無視してください。
CreateVpcEndpoint
のリクエストを投げた後に裏側でVPCエンドポイントに紐づくENIを作成するためにCreateNetworkInterface
とCreateNetworkInterfacePermission
が動いていますね。
ただ、気になるのはCreateNetworkInterface
が17:19:11
以降失敗し、最後にはDeleteNetworkInterface
が実行されている点です。
CreateVpcEndpoint
実行後に発生した17:18:57
と17:18:58
のCreateNetworkInterface
を確認します。
{
"eventVersion": "1.10",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROA6KUFAVPUV2ZKYCUKD:LatticeAssumeRoleSession",
"arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/AWSServiceRoleForVpcLattice/LatticeAssumeRoleSession",
"accountId": "<AWSアカウントID>",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "AROA6KUFAVPUV2ZKYCUKD",
"arn": "arn:aws:iam::<AWSアカウントID>:role/aws-service-role/vpc-lattice.amazonaws.com/AWSServiceRoleForVpcLattice",
"accountId": "<AWSアカウントID>",
"userName": "AWSServiceRoleForVpcLattice"
},
"attributes": {
"creationDate": "2024-12-19T08:18:56Z",
"mfaAuthenticated": "false"
}
},
"invokedBy": "vpc-lattice.amazonaws.com"
},
"eventTime": "2024-12-19T08:18:57Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "CreateNetworkInterface",
"awsRegion": "us-east-1",
"sourceIPAddress": "vpc-lattice.amazonaws.com",
"userAgent": "vpc-lattice.amazonaws.com",
"requestParameters": {
"subnetId": "subnet-0a84d8f4554925b16",
"description": "VPC Endpoint Interface vpce-0e3b1bfc42d162c4a",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9"
}
]
},
"privateIpAddressesSet": {},
"ipv4PrefixCount": 1,
"tagSpecificationSet": {
"items": [
{
"resourceType": "network-interface",
"tags": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
]
},
"clientToken": "e1b4231c-0596-4c1c-8f7c-9685b54bf288-IAD7-attach-grp-iad7-0bb2c627af31f93c0-0",
"denyAllIgwTraffic": true
},
"responseElements": {
"requestId": "ab0bdbed-488c-4027-ba57-45ca932cd4cd",
"networkInterface": {
"networkInterfaceId": "eni-0f995ce7b1b9589de",
"subnetId": "subnet-0a84d8f4554925b16",
"vpcId": "vpc-0d54cbe88a44ffd04",
"availabilityZone": "us-east-1a",
"description": "VPC Endpoint Interface vpce-0e3b1bfc42d162c4a",
"ownerId": "<AWSアカウントID>",
"requesterId": "396074869647",
"requesterManaged": true,
"operator": {
"managed": false
},
"status": "pending",
"macAddress": "0e:95:2d:97:01:75",
"privateIpAddress": "10.10.10.7",
"privateDnsName": "ip-10-10-10-7.ec2.internal",
"sourceDestCheck": true,
"interfaceType": "interface",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9",
"groupName": "default"
}
]
},
"privateIpAddressesSet": {
"item": [
{
"privateIpAddress": "10.10.10.7",
"privateDnsName": "ip-10-10-10-7.ec2.internal",
"primary": true
}
]
},
"ipv6AddressesSet": {},
"ipv4PrefixSet": {
"item": [
{
"ipv4Prefix": "10.10.10.16/28"
}
]
},
"denyAllIgwTraffic": true,
"tagSet": {
"items": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
}
},
"requestID": "ab0bdbed-488c-4027-ba57-45ca932cd4cd",
"eventID": "32c984c0-47c9-4b66-bd38-fecb28288079",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "<AWSアカウントID>",
"eventCategory": "Management"
}
{
"eventVersion": "1.10",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROA6KUFAVPUV2ZKYCUKD:LatticeAssumeRoleSession",
"arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/AWSServiceRoleForVpcLattice/LatticeAssumeRoleSession",
"accountId": "<AWSアカウントID>",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "AROA6KUFAVPUV2ZKYCUKD",
"arn": "arn:aws:iam::<AWSアカウントID>:role/aws-service-role/vpc-lattice.amazonaws.com/AWSServiceRoleForVpcLattice",
"accountId": "<AWSアカウントID>",
"userName": "AWSServiceRoleForVpcLattice"
},
"attributes": {
"creationDate": "2024-12-19T08:18:56Z",
"mfaAuthenticated": "false"
}
},
"invokedBy": "vpc-lattice.amazonaws.com"
},
"eventTime": "2024-12-19T08:18:58Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "CreateNetworkInterface",
"awsRegion": "us-east-1",
"sourceIPAddress": "vpc-lattice.amazonaws.com",
"userAgent": "vpc-lattice.amazonaws.com",
"requestParameters": {
"subnetId": "subnet-0f6a1ce53b9fd9793",
"description": "VPC Endpoint Interface vpce-0e3b1bfc42d162c4a",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9"
}
]
},
"privateIpAddressesSet": {},
"ipv4PrefixCount": 1,
"tagSpecificationSet": {
"items": [
{
"resourceType": "network-interface",
"tags": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
]
},
"clientToken": "e1b4231c-0596-4c1c-8f7c-9685b54bf288-IAD1-attach-grp-iad1-0278a549aef30dfd1-0",
"denyAllIgwTraffic": true
},
"responseElements": {
"requestId": "f20a7f2e-8117-48eb-9d95-c525dcb1204f",
"networkInterface": {
"networkInterfaceId": "eni-09199f7c86c4cddf9",
"subnetId": "subnet-0f6a1ce53b9fd9793",
"vpcId": "vpc-0d54cbe88a44ffd04",
"availabilityZone": "us-east-1b",
"description": "VPC Endpoint Interface vpce-0e3b1bfc42d162c4a",
"ownerId": "<AWSアカウントID>",
"requesterId": "396074869647",
"requesterManaged": true,
"operator": {
"managed": false
},
"status": "pending",
"macAddress": "02:e2:0e:16:f1:95",
"privateIpAddress": "10.10.10.72",
"privateDnsName": "ip-10-10-10-72.ec2.internal",
"sourceDestCheck": true,
"interfaceType": "interface",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9",
"groupName": "default"
}
]
},
"privateIpAddressesSet": {
"item": [
{
"privateIpAddress": "10.10.10.72",
"privateDnsName": "ip-10-10-10-72.ec2.internal",
"primary": true
}
]
},
"ipv6AddressesSet": {},
"ipv4PrefixSet": {
"item": [
{
"ipv4Prefix": "10.10.10.96/28"
}
]
},
"denyAllIgwTraffic": true,
"tagSet": {
"items": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
}
},
"requestID": "f20a7f2e-8117-48eb-9d95-c525dcb1204f",
"eventID": "d8786655-e48a-47fe-9596-c90700d2c5e7",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "<AWSアカウントID>",
"eventCategory": "Management"
}
VPCエンドポイント作成時に指定したサブネットのそれぞれにENIを作成していることが分かります。
また、作成されたENIのIDを確認するとdescribe-vpc-endpoints
の結果に含まれるENI IDと一致していることが分かります。
2つサブネットを指定したためENIは2つ作成されました。そのため、もうENIは作成しなくとも良い認識です。
後続のCreateNetworkInterface
のイベントを確認します。
{
"eventVersion": "1.10",
"userIdentity": {
.
.
(中略)
.
.
},
"eventTime": "2024-12-19T08:19:11Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "CreateNetworkInterface",
"awsRegion": "us-east-1",
"sourceIPAddress": "vpc-lattice.amazonaws.com",
"userAgent": "vpc-lattice.amazonaws.com",
"requestParameters": {
"subnetId": "subnet-0f6a1ce53b9fd9793",
"description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9"
}
]
},
"privateIpAddressesSet": {},
"ipv4PrefixCount": 1,
"tagSpecificationSet": {
"items": [
{
"resourceType": "network-interface",
"tags": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
]
},
"clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0f6a1ce53b9fd9793-c4b30c7dc2a05705d7254ff5a4607382",
"denyAllIgwTraffic": true
},
"responseElements": {
"requestId": "09d2108d-4f4a-4d93-bb46-8bc414fc8420",
"networkInterface": {
"networkInterfaceId": "eni-0735a3b9f10ac264c",
"subnetId": "subnet-0f6a1ce53b9fd9793",
"vpcId": "vpc-0d54cbe88a44ffd04",
"availabilityZone": "us-east-1b",
"description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
"ownerId": "<AWSアカウントID>",
"requesterId": "396074869647",
"requesterManaged": true,
"operator": {
"managed": false
},
"status": "pending",
"macAddress": "02:59:5b:bb:e7:b1",
"privateIpAddress": "10.10.10.77",
"privateDnsName": "ip-10-10-10-77.ec2.internal",
"sourceDestCheck": true,
"interfaceType": "interface",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9",
"groupName": "default"
}
]
},
"privateIpAddressesSet": {
"item": [
{
"privateIpAddress": "10.10.10.77",
"privateDnsName": "ip-10-10-10-77.ec2.internal",
"primary": true
}
]
},
"ipv6AddressesSet": {},
"ipv4PrefixSet": {
"item": [
{
"ipv4Prefix": "10.10.10.80/28"
}
]
},
"denyAllIgwTraffic": true,
"tagSet": {
"items": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
}
},
"requestID": "09d2108d-4f4a-4d93-bb46-8bc414fc8420",
"eventID": "5589d598-6dc7-4fef-8e13-bdffeb861169",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "<AWSアカウントID>",
"eventCategory": "Management"
}
{
"eventVersion": "1.10",
"userIdentity": {
.
.
(中略)
.
.
},
"eventTime": "2024-12-19T08:19:22Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "CreateNetworkInterface",
"awsRegion": "us-east-1",
"sourceIPAddress": "vpc-lattice.amazonaws.com",
"userAgent": "vpc-lattice.amazonaws.com",
"errorCode": "Client.InvalidParameterValue",
"errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
"requestParameters": {
"subnetId": "subnet-0a84d8f4554925b16",
"description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9"
}
]
},
"privateIpAddressesSet": {},
"ipv4PrefixCount": 1,
"tagSpecificationSet": {
"items": [
{
"resourceType": "network-interface",
"tags": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
]
},
"clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
"denyAllIgwTraffic": true
},
"responseElements": null,
"requestID": "3b595aa9-79d4-4cfe-8b1e-2c5d6da16f3b",
"eventID": "ae927c5d-6ff2-463f-9c7f-4828c48d947a",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "<AWSアカウントID>",
"eventCategory": "Management"
}
{
"eventVersion": "1.10",
"userIdentity": {
.
.
(中略)
.
.
},
"eventTime": "2024-12-19T08:19:34Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "CreateNetworkInterface",
"awsRegion": "us-east-1",
"sourceIPAddress": "vpc-lattice.amazonaws.com",
"userAgent": "vpc-lattice.amazonaws.com",
"errorCode": "Client.InvalidParameterValue",
"errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
"requestParameters": {
"subnetId": "subnet-0a84d8f4554925b16",
"description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9"
}
]
},
"privateIpAddressesSet": {},
"ipv4PrefixCount": 1,
"tagSpecificationSet": {
"items": [
{
"resourceType": "network-interface",
"tags": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
]
},
"clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
"denyAllIgwTraffic": true
},
"responseElements": null,
"requestID": "586565b1-b04f-4fda-961a-bc540c1e2ecb",
"eventID": "5be23df4-04a5-4fb1-818b-9c9e89222d3a",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "<AWSアカウントID>",
"eventCategory": "Management"
}
{
"eventVersion": "1.10",
"userIdentity": {
.
.
(中略)
.
.
},
"eventTime": "2024-12-19T08:19:49Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "CreateNetworkInterface",
"awsRegion": "us-east-1",
"sourceIPAddress": "vpc-lattice.amazonaws.com",
"userAgent": "vpc-lattice.amazonaws.com",
"errorCode": "Client.InvalidParameterValue",
"errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
"requestParameters": {
"subnetId": "subnet-0a84d8f4554925b16",
"description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9"
}
]
},
"privateIpAddressesSet": {},
"ipv4PrefixCount": 1,
"tagSpecificationSet": {
"items": [
{
"resourceType": "network-interface",
"tags": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
]
},
"clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
"denyAllIgwTraffic": true
},
"responseElements": null,
"requestID": "a0f1ab29-f6a4-4dce-a83c-580f83354444",
"eventID": "194b190e-969a-4ec1-8b4f-b08f722c09be",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "<AWSアカウントID>",
"eventCategory": "Management"
}
{
"eventVersion": "1.10",
"userIdentity": {
.
.
(中略)
.
.
},
"eventTime": "2024-12-19T08:20:06Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "CreateNetworkInterface",
"awsRegion": "us-east-1",
"sourceIPAddress": "vpc-lattice.amazonaws.com",
"userAgent": "vpc-lattice.amazonaws.com",
"errorCode": "Client.InvalidParameterValue",
"errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
"requestParameters": {
"subnetId": "subnet-0a84d8f4554925b16",
"description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9"
}
]
},
"privateIpAddressesSet": {},
"ipv4PrefixCount": 1,
"tagSpecificationSet": {
"items": [
{
"resourceType": "network-interface",
"tags": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
]
},
"clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
"denyAllIgwTraffic": true
},
"responseElements": null,
"requestID": "20aae5bf-11f7-4769-a218-5831b04a28d0",
"eventID": "bc9a742e-4891-4bd8-8460-8ecb55ed6e5e",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "<AWSアカウントID>",
"eventCategory": "Management"
}
{
"eventVersion": "1.10",
"userIdentity": {
.
.
(中略)
.
.
},
"eventTime": "2024-12-19T08:20:27Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "CreateNetworkInterface",
"awsRegion": "us-east-1",
"sourceIPAddress": "vpc-lattice.amazonaws.com",
"userAgent": "vpc-lattice.amazonaws.com",
"errorCode": "Client.InvalidParameterValue",
"errorMessage": "There aren't sufficient free Ipv4 addresses or prefixes",
"requestParameters": {
"subnetId": "subnet-0a84d8f4554925b16",
"description": "VPC Endpoint Interface: vpce-0e3b1bfc42d162c4a",
"groupSet": {
"items": [
{
"groupId": "sg-0e2239cc74c5c84f9"
}
]
},
"privateIpAddressesSet": {},
"ipv4PrefixCount": 1,
"tagSpecificationSet": {
"items": [
{
"resourceType": "network-interface",
"tags": [
{
"key": "VpcLatticeManaged",
"value": "true"
}
]
}
]
},
"clientToken": "vpce-0e3b1bfc42d162c4a-subnet-0a84d8f4554925b16-c4b30c7dc2a05705d7254ff5a4607382",
"denyAllIgwTraffic": true
},
"responseElements": null,
"requestID": "1e09a42d-2da4-4477-9dbc-a659e99072f3",
"eventID": "fc1e7390-ca76-4bdf-b7d3-0c35e0615a42",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "<AWSアカウントID>",
"eventCategory": "Management"
}
既にENI作成済みのsubnet-0f6a1ce53b9fd9793
とsubnet-0a84d8f4554925b16
にさらにENIを作成しようとしたことが分かります。
また、subnet-0f6a1ce53b9fd9793
へのENI作成は正常に行われましたが、subnet-0a84d8f4554925b16
は失敗しています。失敗の理由は軒並みThere aren't sufficient free Ipv4 addresses or prefixes
です。
Service Network型VPCエンドポイントのENI作成リクエストのパラメーターを見るとわかるようにipv4PrefixCount
が1
となっています。ipv4PrefixCount
で指定した場合のipv4Prefix
のサブネットマスクは/28
です。そのため、ENIを作成するために/28
の連続するIPアドレスが空いている必要があります。
subnet-0a84d8f4554925b16
で使用しているIPアドレスは以下のとおりです。
aws ec2 describe-network-interfaces \
--filters "Name=subnet-id,Values=subnet-0a84d8f4554925b16" \
--query "NetworkInterfaces[].{PrivateIpAddress : PrivateIpAddress, Ipv4Prefixes : Ipv4Prefixes[].Ipv4Prefix}"
[
{
"PrivateIpAddress": "10.10.10.36",
"Ipv4Prefixes": null
},
{
"PrivateIpAddress": "10.10.10.7",
"Ipv4Prefixes": [
"10.10.10.16/28"
]
},
{
"PrivateIpAddress": "10.10.10.13",
"Ipv4Prefixes": null
}
]
subnet-0a84d8f4554925b16
のCIDRブロックは10.10.10.0/26
です。先ほどの使用済みIPアドレスをマッピングすると以下のとおりです。
追加でIpv4Prefixes
として/28
のサブネットマスクの領域を割り当てることがないことが分かります。
「10.10.10.48/28
が空いているのでは?」と思われるかもしれませんが、ブロードキャストアドレスである10.10.10.63/32
と重複してしまっています。
Ipv4Prefixes
はAWSによって予約されたIPアドレスを含むことができません。そのため、無理やり指定しようとしてもThe prefix 10.10.10.48/28 in subnet subnet-0a84d8f4554925b16 overlaps with reserved addresses.
と怒られます。
つまりは単純に「Service Network型VPCエンドポイントを配置するサブネットにはIPアドレスが/28 + /32 = 17個空いていれば良い」という訳ではありません。
なぜ、余計にENIを作成しようとするのか
ここで、「なぜ、Service Network型VPCエンドポイントを作成する際に余計にENIを作成しようとするのか」が気になります。
色々検証しましたが、結論わかりません。
検証結果をまとめると以下の通りです。
検証内容 | 指定したサブネット内のENIの状況 | 結果 |
---|---|---|
/26の2つのサブネットの指定順番を入れ替える | VPCエンドポイント以外のENIが2つ存在 | ENIを複数作成しようとする |
/26のサブネットを一つ指定 | VPCエンドポイント以外のENIが2つ存在 | ENIを複数作成しようとする |
/26のサブネットを一つ指定 | ENIなし | ENIを一つ作成する |
/25のサブネットを一つ指定 | ENIなし | ENIを一つ作成する |
/25と/26のサブネットを指定する | ENIなし | ENIを複数作成しようとする |
/25のサブネットの空きIPアドレスが58個の状態で指定 | VPCエンドポイント以外のENIが1つ存在 | ENIを一つ作成する |
「/26だから」、「既にサブネットにENIがあるから」、「空きが少ないから」という理由がきっかけで1サブネットにENIを複数作成しようとする訳ではなさそうです。
Service Network型VPCエンドポイントを作成する場合は、残りのIPアドレスの個数だけではなく残りの/28のCIDRブロックが重要
Service Network型VPCエンドポイントの作成が失敗しても使える時の裏側を確認してみました。
余計にENIを作成しようとする原因は分かりませんが、Service Network型VPCエンドポイントを作成する場合は、残りのIPアドレスの個数だけではなく残りの/28のCIDRブロックが重要ということが分かりました。
残りのIPアドレスの個数だけで判断すると痛い目に遭いそうです。
また、VPCエンドポイントそれぞれに/28
の割り当てが必要になるため、Service Networkを小分けにしており、Service Network型VPCエンドポイントを複数作成する必要がある場合はIPアドレスの確保に苦労すると予想します。/26
だとVPCエンドポイントは作成できて2つまでです。
可能な限りService Networkに集約するか、Service Network型VPC Associationを使用しましょう。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!